/*
 * All rights Reserved, Designed By DataDriver
 * Copyright:    DataDriver.Inc
 * Company:      Zhuo Wo Infomation Technology (ShangHai) CO.LTD
 */
package com.sun;


import com.sun.config.ExtendConfig;
import com.sun.config.MyEventPulish;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import java.util.Arrays;

public class MainTest {


    /**
     * 初始化容器的执行过程：
     *
     * 1、首先使用AnnotationConfigApplicationContext创建IOC容器
     * 2、refresh();容器刷新机制
     *   1): prepareRefresh();准备刷新【那么准备刷新做了哪些工作呢？】
     *     -- 首先记录一些时间信息，清除一些缓存然后initPropertySources();初始化一些属性设置
     *     但是默认情况下是没有的，我们要是默认设置一些属性可以实现initPropertySources()这个方法
     *     -- 然后就是属性的校验getEnvironment().validateRequiredProperties();
     *     -- earlyApplicationEvents保存容器中一些早期的事件
     *   2): obtainFreshBeanFactory 获取BeanFactory获取Bean工厂
     *        --refreshBeanFactory();先刷新创建Bean工厂为this.beanFactory.setSerializationId(getId());设置了一个序列化ID,创建
     *        对象DefaultListableBeanFactory；
     *        -- 获取getBeanFactory返回
     *   3): prepareBeanFactory(beanFactory);预设值一些默认信息； 通过上述步骤，Bean工厂就准备完成了，默认的一些初始化设置就完成了
     *       /**
     *      beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
     * 		beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
     * 		beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
     * 		beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
     * 		beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
     * 		beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
     * 		beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
     * 		beanFactory.ignoreDependencyInterface(ApplicationStartup.class);
     *      ......等等的相关默认设置
     *      系统的配置文件，系统运行的环境呀等等配置信息，还预值了一些Bean的后处理接口
     *
     *   4): postProcessBeanFactory(beanFactory);进行后置处理工作。在BeanFactory创建并准备完成后
     *   5）: invokeBeanFactoryPostProcessors(beanFactory);添加Bean工厂的后置处理器BeanFactoryPostProcessor
     *
     */
    public static void main(String[] args) {

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ExtendConfig.class);
        context.publishEvent(new MyEventPulish("1","zhangsan", Arrays.asList(2,3,4,5)));

    }



}
